#include "front/text_normalize.h"

using namespace std;
using namespace ppspeech;

const vector< pair<string, string> > VecStrStr_BaseReplaceSymbol = {
	{"==", "="},
	{"°C", "℃"},
	{"OMG!", "oh my god!"},
	{"为AI", "位诶哎"}
};

const map<wchar_t, wchar_t> MapWcharWchar_BaseReplaceSymbol = {
	{L'／', L'/'},		{L'！', L'!'},		{L'？', L'?'},		{L'	', L' '},		{L'％', L'%'},		{L'．', L'.'},

	{L'＋', L'+'},
	{L'－', L'-'},		{L'﹣', L'-'},
	{L'＝', L'='},

	{L'—', L'-'},		{L'～', L'~'},

	{L'‘', L'\''},		{L'’', L'\''},		{L'“', L'\"'},		{L'”', L'\"'},

	{L'：', L':'},		{L'∶', L':'}, 

	{L'→', L'，'},		{L'←', L'，'},		{L'↑', L'，'},		{L'↓', L'，'},
	{L'╥', L' '},		{L'⊙', L'，'},		{L'◎', L'，'},

	{L'＜', L'<'},		{L'＞', L'>'},		{L'‹', L'<'},		{L'›', L'>'},		{L'〈', L'<'},		{L'〉', L'>'},
	
	{L'(', L'（'},		{L')', L'）'},		{L'[', L'［'},		{L']', L'］'},		{L'{', L'｛'},		{L'}', L'｝'},
	{L'﹝', L'［'},		{L'﹞', L'］'},		{L'〔', L'［'},		{L'〕', L'］'},		{L'【', L'［'},		{L'】', L'］'},
	{L'〖', L'［'},		{L'〗', L'］'},		{L'「', L'［'},		{L'」', L'］'},		{L'『', L'［'},		{L'』', L'］'},

	{L'￡', L'£'},

	{L'１', L'1'},	{L'２', L'2'},	{L'３', L'3'},	{L'４', L'4'},	{L'５', L'5'},
	{L'６', L'6'},	{L'７', L'7'},	{L'８', L'8'},	{L'９', L'9'},	{L'０', L'0'},
};


const map<wchar_t, wstring> MapWcharWstr_ZhReplaceSymbol = {
//	{L'+', L"加"},
	{L'×', L"乘"},
	{L'÷', L"除以"},
	{L'=', L"等于"},

	{L'℃', L"摄氏度"},	{L'℉', L"华氏度"},
//	{L'*', L"星"},
	{L'#', L"井"},		{L'&', L"与"},		{L'|', L"或"},

//	{L'√', L"勾"},		{L'×', L"叉"},

	{L'①', L" 一，"},	{L'②', L" 二，"},	{L'③', L" 三，"},	{L'④', L" 四，"},	{L'⑤', L" 五，"},
	{L'⑥', L" 六，"},	{L'⑦', L" 七，"},	{L'⑧', L" 八，"},	{L'⑨', L" 九，"},	{L'⑩', L" 十，"},
};


const map<wchar_t, wstring> MapWcharWstr_EnReplaceSymbol = {
//	{L'+', L"plus"},		//减法minus
	{L'×', L"times"},
	{L'÷', L"divided by"},
	{L'=', L"equals"},

	{L'℃', L"centigrade"},		{L'℉', L"fahrenheit degree"},
//	{L'*', L"star"},
	{L'#', L"hash"},	{L'&', L"and"},			{L'|', L"or"},

//	{L'√', L"tick"},	{L'×', L"cross"},

	{L'①', L"one，"},	{L'②', L"two，"},		{L'③', L"three，"},		{L'④', L"four，"},		{L'⑤', L"five，"},
	{L'⑥', L"six，"},	{L'⑦', L"seven，"},		{L'⑧', L"eight，"},		{L'⑨', L"nine，"},		{L'⑩', L"ten，"},
};


void TextNormalizer::TnReInitialSymbol(wstring* fpInWsentence, const LanguageEnum fcInLanguage)
{
	wstring tWstrBase1 = *fpInWsentence;
	for(pair<string, string> tPair : VecStrStr_BaseReplaceSymbol) {
		WstrReplace(tWstrBase1, tPair.first, tPair.second);
	}

	wstring tWstrBase2 = L"";
	for(const wchar_t& tcWchar : tWstrBase1) {
		const auto tcIterator = MapWcharWchar_BaseReplaceSymbol.find(tcWchar);
		if(MapWcharWchar_BaseReplaceSymbol.end() != tcIterator) {	//替换符号
			tWstrBase2 += tcIterator->second;
		}
		else {
			tWstrBase2 += tcWchar;
		}
	}

	wstring tWstrBase3 = L"";
	const auto tcMapReplaceSymbol = (fcInLanguage==LANG_EN) ? MapWcharWstr_EnReplaceSymbol : MapWcharWstr_ZhReplaceSymbol;

	for(const wchar_t& tcWchar : tWstrBase2) {
		const auto tcIterator = tcMapReplaceSymbol.find(tcWchar);
		if(tcMapReplaceSymbol.end() != tcIterator) {
			tWstrBase3 += (fcInLanguage==LANG_EN) ? L" " : L"";
			tWstrBase3 += tcIterator->second;
			tWstrBase3 += (fcInLanguage==LANG_EN) ? L" " : L"";
		}
		else {
			tWstrBase3 += tcWchar;
		}
	}

	(*fpInWsentence) = tWstrBase3;
}
